ApplyPreconditioner Function

public function ApplyPreconditioner(params, method) result(y)

Arguments

Type IntentOptional Attributes Name
class(IterativeParams), intent(in) :: params
class(MethodPreconditioner), intent(in) :: method

Return Value real(kind=dp), DIMENSION(SIZE(params%x_init))


Calls

proc~~applypreconditioner~~CallsGraph proc~applypreconditioner ApplyPreconditioner proc~backward backward proc~applypreconditioner->proc~backward proc~forward forward proc~applypreconditioner->proc~forward

Source Code

    FUNCTION ApplyPreconditioner(params, method) RESULT(y)
        CLASS(IterativeParams), INTENT(IN) :: params
        CLASS(MethodPreconditioner), INTENT(IN) :: method
        REAL(dp), DIMENSION(SIZE(params%x_init)) :: y

        SELECT CASE(method%value)
        CASE (METHOD_PRECOND_JACOBI%value)
            IF(.NOT. ALLOCATED(params%D)) STOP "ERROR :: Jacobi preconditioner requires &
                                                &preconditioner matrix D to be allocated"
            y = MATMUL(params%D, params%residual)
        CASE (METHOD_PRECOND_GS%value)
            IF(.NOT. ALLOCATED(params%L)) STOP "ERROR :: Gauss-Seidel preconditioner requires &
                                                &preconditioner matrix L to be allocated"
            y = forward(params%L, params%residual)
        CASE (METHOD_PRECOND_SOR%value)
            IF(.NOT. ALLOCATED(params%L)) STOP "ERROR :: SOR preconditioner requires &
                                                &preconditioner matrix L to be allocated"
            y = forward(params%L, params%residual)
        CASE (METHOD_PRECOND_JOR%value)
            IF(.NOT. ALLOCATED(params%D)) STOP "ERROR :: JOR preconditioner requires &
                                                &preconditioner matrix D to be allocated"
            y = MATMUL(params%D, params%residual)
        CASE (METHOD_PRECOND_ILU%value)
            IF(.NOT. ALLOCATED(params%L) .OR. &
               .NOT. ALLOCATED(params%U)) STOP "ERROR :: ILU preconditioner requires &
                                                &preconditioner matrices L and U to be allocated"
            y = forward(params%L, params%residual)
            y = backward(params%U, y)
        CASE (METHOD_PRECOND_ICF%value)
            IF(.NOT. ALLOCATED(params%L)) STOP "ERROR :: ICF preconditioner requires &
                                                &preconditioner matrix L to be allocated"
            y = forward(params%L, params%residual)
            y = backward(TRANSPOSE(params%L), y)
        CASE (METHOD_PRECOND_SSOR%value)
            IF(.NOT. ALLOCATED(params%L) .OR. &
               .NOT. ALLOCATED(params%D)) STOP "ERROR :: SSOR preconditioner requires &
                                                &preconditioner matrices L and D to be allocated"
            y = forward(params%L, params%residual)
            y = MATMUL(params%D, y)
            y = backward(TRANSPOSE(params%L), y)
        CASE DEFAULT
            STOP "ERROR :: Unknown preconditioner method"
        END SELECT

    END FUNCTION ApplyPreconditioner